【小ネタ】暗号化していない RDS DBの作成を拒否するポリシー
暗号化していない RDS DBの作成を拒否するポリシー
以下ポリシーを作成しました。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyCreatingNonEncryptedDBCluster", "Effect": "Deny", "Action": [ "rds:CreateDBCluster" ], "Resource": "*", "Condition": { "Null": { "rds:StorageEncrypted": false }, "Bool": { "rds:StorageEncrypted": false } } }, { "Sid": "DenyCreatingNonEncryptedDBInstance", "Effect": "Deny", "Action": [ "rds:CreateDBInstance" ], "Resource": "*", "Condition": { "Null": { "rds:DatabaseEngine": false, "rds:StorageEncrypted": false }, "StringEquals": { "rds:DatabaseEngine": [ "custom-oracle-ee", "mariadb", "mysql", "oracle-ee", "oracle-ee-cdb", "oracle-se2", "oracle-se2-cdb", "postgres", "sqlserver-ee", "sqlserver-se", "sqlserver-ex", "sqlserver-web" ] }, "Bool": { "rds:StorageEncrypted": false } } } ] }
各ステートメント(DenyCreatingNonEncryptedDBInstance
, DenyCreatingNonEncryptedDBCluster
)
を順番に解説します。
ステートメント 1つめ( DenyCreatingNonEncryptedDBCluster
)
"Sid": "DenyCreatingNonEncryptedDBCluster", "Effect": "Deny", "Action": [ "rds:CreateDBCluster" ], "Resource": "*", "Condition": { (略) }
Aurora DBクラスターの作成を制限しています。
Condition部分の説明は以下のとおりです。
- ストレージ暗号化有無の条件キー (
rds:StorageEncrypted
) が存在すること - ストレージ暗号化有無の条件キー (
rds:StorageEncrypted
) の値が false であること
上記 2つが満たされたときにステートメントが適用、つまりDBクラスターの作成が拒否されます。
ステートメント 2つめ( DenyCreatingNonEncryptedDBInstance
)
"Sid": "DenyCreatingNonEncryptedDBInstance", "Effect": "Deny", "Action": [ "rds:CreateDBInstance" ], "Resource": "*", "Condition": { (略) }
RDS DBインスタンスの作成を制限しています。
Condition部分の説明は以下のとおりです。
- ストレージ暗号化有無の条件キー (
rds:StorageEncrypted
) が存在すること - データベースエンジンの条件キー (
rds:DatabaseEngine
) の値が Aurora系 以外 であること ※ - ストレージ暗号化有無の条件キー (
rds:StorageEncrypted
) の値が false であること
上記 3つが満たされたときにステートメントが適用、つまりDBインスタンスの作成が拒否されます。
※ データベースエンジンの条件キー周りの判定について
- Aurora系 以外 のDBエンジン名は CreateDBInstance APIリファレンスから拾っています
- そもそもこの判定いるの? については補足で説明します
試してみる
AdministratorAccess + 上述ポリシー
をアタッチしているIAMロール上で試行します。
適当に 暗号化なし Auroraクラスターを作成しようと試みます。
結果、以下のように作成が拒否されました。
暗号化あり Aurora クラスターは問題なく作成できました。
↓
おわりに
暗号化していない RDS DBの作成を拒否するポリシーを作成してみました。 AWS環境の予防的ガードレールとして、AWS Organizations のサービスコントロールポリシー(SCP)等で活用できると思います。
参考
補足
ステートメントまとめちゃダメなの?
※ これは 2021/11/03時点で、公式ドキュメントには見つからなかったトピックです
ポリシー設計にあたって、はじめは以下のように 1ステートメントにまとめるポリシー を作っていました。 が、これは Auroraクラスター作成時に正しく動作しません 。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyCreatingNonEncryptedDB", "Effect": "Deny", "Action": [ "rds:CreateDBInstance", "rds:CreateDBCluster" ], "Resource": "*", "Condition": { "Null": { "rds:StorageEncrypted": false }, "Bool": { "rds:StorageEncrypted": false } } } ] }
マネコンから Auroraクラスター作成( CreateDBCluster
) を実行すると、
RDSは自動的にクラスターのプライマリインスタンスも作成 ( CreateDBInstance
) します。
この動作は CloudTrail からも確認できました。
しかし、この CreateDBInstance
のリクエストのパラメータに
StorageEncrypted=false が必ず付くようです 。
そのため前述したポリシーでは、暗号化有り StorageEncrypted=true
でクラスターを作成したとしても、
後続の CreateDBInstance
で拒否されてしまいます。
そのため CreateDBInstance
の制限に DBエンジンのフィルタを追加して、明示的に Aurora以外とする必要があったのです。
※ 「 StorageEncrypted=false が付くのであれば Aurora クラスターのインスタンスはストレージ暗号化されてないのでは?」という
懸念が出てくると思いますが問題ないです。
Auroraエンジンの CreateDBInstance
リクエストは StorageEncryptedパラメータを無視します。
クラスターの StorageEncryptedパラメータを継承します。
–storage-encrypted | –no-storage-encrypted (boolean)
A value that indicates whether the DB instance is encrypted. By default, it isn't encrypted.
Amazon Aurora
Not applicable. The encryption for DB instances is managed by the DB cluster.
–
aws rds create-db-instance help
コマンドより